第 1 章:建立管理與終止容器
啟動 docker run
例如,下面的命令輸出一個 “Hello World”,之後終止容器。
sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
這跟在本地直接執行 /bin/echo 'hello world'
相同, 幾乎感覺不出任何區別。
下面的命令則啟動一個 bash 終端,允許使用者進行互動。
sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
-t
選項讓Docker分配一個虛擬終端(pseudo-tty)並綁定到容器的標準輸入上-i
則讓容器的標準輸入保持打開
在互動模式下,使用者可以透過所建立的終端來輸入命令,例如
ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
當利用 docker run
來建立容器時,Docker 在後臺執行的標準操作包括:
- 檢查本地是否存在指定的映像檔,不存在就從公有倉庫下載
- 利用映像檔建立並啟動一個容器
- 分配一個檔案系統,並在唯讀的映像檔層外面掛載一層可讀寫層
- 從宿主主機設定的網路橋介面中橋接一個虛擬埠到容器中去
- 從位址池中設定一個 ip 位址給容器
- 執行使用者指定的應用程式
- 執行完畢後容器被終止
啟動已終止容器 docker start
容器的核心為所執行的應用程式,所需要的資源都是應用程式執行所必需的。除此之外,並沒有其它的資源。可以在虛擬終端中利用 ps
或 top
來查看程式訊息。
ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
可見,容器中僅執行了指定的 bash 應用。這種特點使得 Docker 對資源的使用率極高,是貨真價實的輕量級虛擬化。
常駐執行
更多的時候,需要讓 Docker 容器在後臺以常駐(Daemonized)形式執行。此時,可以透過新增 -d
參數來實作。
例以下面的命令會在後臺執行容器。
sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
容器啟動後會回傳一個唯一的 id,也可以透過 docker ps
命令來查看容器訊息。
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
要取得容器的輸出訊息,可以透過 docker logs
命令。
sudo docker logs insane_babbage
hello world
hello world
hello world
. . .
進入容器
在使用 -d
參數時,容器啟動後會進入背景執行。 某些時候需要進入容器進行操作,有很多種方法,包括使用 docker attach
命令或 nsenter
工具等。
exec 命令
docker exec
是Docker內建的命令。下面示範如何使用該命令。
sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
sudo docker exec -ti nostalgic_hypatia bash
attach 命令
docker attach
亦是 Docker 內建的命令。下面示例如何使用該命令。
sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
sudo docker attach nostalgic_hypatia
按下 ctrl
+ P
然後 ctrl
+ Q
跳離容器,讓它繼續在背景執行。
但是使用 attach
命令有時候並不方便。當多個視窗同時 attach 到同一個容器的時候,所有視窗都會同步顯示。當某個視窗因命令阻塞時,其他視窗也無法執行操作了。